<?php

class Application_Model_JogoMapper
{

    protected $_dbTable;

    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;

        return $this;
    }

    public function getDbTable()
    {
        if (null === $this->_dbTable) {
            $this->setDbTable('Application_Model_DbTable_Jogo');
        }
        return $this->_dbTable;
    }

    /**
     * Insere um jogo no banco de dados.
     *
     * @param Application_Model_Jogo $jogo Modelo em memoria do jogo
     */
    public function salvar (Application_Model_Jogo $jogo)
    {

        $dados = array(
                'id'  => $jogo->getId(),
                'nome_campeonato'  => $jogo->getCampeonatoId(),
                'data'  => $jogo->getData()->toString('YYYY-MM-dd HH:mm:ss'),
                'time_a' => $jogo->getTimeA(),
                'time_b' => $jogo->getTimeB(),
                'placar_parcial' => $jogo->getPlacarParcial(),
                'gols_time_a' => $jogo->getGolsTimeA(),
                'gols_time_b' => $jogo->getGolsTimeB(),
                'ordem_de_gols' => $jogo->getOrdemGols(),
        );

        if ( null === ( $id = $jogo->getId() ) ) {
            unset($dados['id']);
            $this->getDbTable()->insert($dados);
        } else {
            $this->getDbTable()->update($dados, array('id = ?' => $id));
        }
    }


    /**
     * Localiza e retorna todos os jogos que pertencem a um determinado
     * campeonato, retornando um modelo em memoria para cada um dos jogos
     * localizados.
     *
     * @param <type> $campeonato_id identificador do campeonato
     */

    public function localizarPeloCampeonato ($campeonato_id) {

        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->distinct()
               ->where('nome_campeonato = ?', $campeonato_id);

        $busca = $tabela->fetchAll($select);

        $resultado = array();
        
        foreach ($busca as $atual)
        {
            $resultado[] = new Application_Model_Jogo($atual['id'], 
                    $atual['nome_campeonato'], $atual['data'],
                    $atual['time_a'], $atual['time_b'],
                    $atual['placar_parcial'], $atual['gols_time_a'],
                    $atual['gols_time_b'], $atual['ordem_de_gols']);
            
        }

        return $resultado;
         

    }

    public function fetch ($id)
    {

        $dataAtual = new Zend_Date();
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('id = ?', $id)
               ->where('data > ?', $dataAtual->toString('YYYY-MM-dd HH:mm:ss'));

        $resultado = $tabela->fetchAll($select);

        if (count($resultado) == 0) {
            return null;
        } else {

            $jogo = $resultado->current();

            return  new Application_Model_Jogo($jogo['id'],
            $jogo['nome_campeonato'], 
            new Zend_Date($jogo['data']),
            $jogo['time_a'], $jogo['time_b'],
            $jogo['placar_parcial'], $jogo['gols_time_a'],
            $jogo['gols_time_b'], $jogo['ordem_de_gols']);
        }
    }

    public function fetchAll ($total, $inicio)
    {       
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->order('data ASC')
               ->limit($total, $inicio);

        $resultado = $tabela->fetchAll($select);

        if (count($resultado) == 0) {
            return null;
        }

        return $resultado;
    }

    public function jogosSemResultados ($total, $inicio)
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('data < now()')
               ->where('gols_time_a IS NULL')
               ->order('data ASC')
               ->limit($total, $inicio);

        $resultado = $tabela->fetchAll($select);

        if (count($resultado) == 0) {
            return null;
        }

        return $resultado;
    }

    public function getTotaljogosSemResultados ()
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('data < now()')
               ->where('gols_time_a IS NULL');

        $resultado = $tabela->fetchAll($select);

        $cont = count($resultado);

        return $cont;
    }

    public function getTotal()
    {
        $tabela = $this->getDBTable();

        $resultado = $tabela->fetchAll();

        $cont = count($resultado);

        return $cont;
    }

    public function fetch_sem_data($id)
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('id = ?', $id);

        $resultado = $tabela->fetchAll($select);

        if (count($resultado) == 0) {
            return null;
        } else {

            $jogo = $resultado->current();

            return  new Application_Model_Jogo($jogo['id'],
            $jogo['nome_campeonato'],
            new Zend_Date($jogo['data']),
            $jogo['time_a'], $jogo['time_b'],
            $jogo['placar_parcial'], $jogo['gols_time_a'],
            $jogo['gols_time_b'], $jogo['ordem_de_gols']);
        }
    }

}

